"""
RagFlow 客户端主程序入口
"""

import argparse
import sys
from typing import List, Optional

from ragflow_client.config import RagFlowConfig
from ragflow_client.service import RagFlowService
from ragflow_client.utils.logger import get_logger

logger = get_logger(__name__)


def main(args: Optional[List[str]] = None) -> int:
    """
    主函数
    
    Args:
        args: 命令行参数
        
    Returns:
        退出码，0 表示成功，非 0 表示失败
    """
    # 解析命令行参数
    parser = argparse.ArgumentParser(description="RagFlow 客户端")
    parser.add_argument("--gui", action="store_true", help="启动图形界面")
    parser.add_argument("--no-gui", action="store_true", help="不启动图形界面，使用命令行模式")
    parser.add_argument("--batch-size", type=int, default=10, help="批量上传的批次大小")
    parser.add_argument("--cli", action="store_true", help="使用命令行工具模式")
    
    # 如果使用命令行工具模式，则将剩余参数传递给命令行工具
    if "--cli" in (args or sys.argv):
        from ragflow_client.cli import main as cli_main
        # 移除 --cli 参数
        filtered_args = [arg for arg in (args or sys.argv[1:]) if arg != "--cli"]
        return cli_main(filtered_args)
    
    parsed_args = parser.parse_args(args)
    
    # 如果启动图形界面
    if parsed_args.gui:
        try:
            # 导入 PySide6 GUI 模块
            from ragflow_client.gui.pyside_app import run_pyside_gui
            # 运行 PySide6 GUI
            run_pyside_gui()
            return 0
        except ImportError:
            logger.error("启动图形界面失败: 无法导入PySide6库")
            logger.error("请通过以下命令安装PySide6: uv add PySide6")
            return 1
        except Exception as e:
            logger.exception(f"启动图形界面时出错: {str(e)}")
            return 1
    
    # 命令行模式
    logger.info("启动 RagFlow 客户端...")
    
    try:
        # 加载配置
        config = RagFlowConfig.from_env()
        
        # 创建服务
        service = RagFlowService(config)
        
        # 上传文件
        logger.info("开始上传知识库文件")
        status, message = service.upload_files_batch(batch_size=parsed_args.batch_size)
        
        if status:
            logger.info(f"上传成功: {message}")
            return 0
        else:
            logger.error(f"上传失败: {message}")
            return 1
            
    except Exception as e:
        logger.exception(f"程序执行出错: {str(e)}")
        return 1


if __name__ == "__main__":
    sys.exit(main(sys.argv[1:]))